const config = require('../../config');
const name = 'wCore小程序';
const version = '1.0.0';
/**
 * 把云函数调用转换成promise同步调用
 * @param {string} funName 要调用的云函数名称
 * @param {Object} objData 调用云函数需要传递的参数
 * @returns  {Object} 返回请求的结果对象
 */
const cloudFunToPromise = function (funName, objData = {}) {
  const intStartTime = new Date().getTime();
  const objReturn = new Promise(function (resolve, reject) {
    wx.cloud.callFunction({
      name: funName,
      data: { ...objData, intStartTime },
      success: function (res) {
        console.log(`cloudFunToPromise-${funName}:`, res);
        const intEndTime = new Date().getTime();
        resolve(res.result);
      },
      fail: function (error) {
        reject(error);
      }
    });
  });
  return objReturn;
};

/**
 * 通用重定向方法
 * @param {Object} target 重定向目标
 * @param {String} target.type 重定向类型(app: 外部小程序; h5: 外部h5页面; page: 小程序内部页面)
 * @param {String} target.option 重定向选项
 * @param {String} target.option.url type 为 h5 和 page 时有效，表示路径
 * @param {bool} target.option.isLogin 是否需要认证才能跳转，true 是，false 不是
 * @return {undefined} 无返回
 */
const redirect = function ({ type = 'page', option = {} }) {
  if (option && option.isLogin) { // 需要登录，默认不需要
    const objUserInfo = wx.getStorageSync('userinfo');
    if (!objUserInfo || !objUserInfo.uid) {
      wx.showToast({ title: '请先完成实名认证', icon: 'none', mask: true, duration: 2000 });
      // setTimeout(() => { toPage('/packageReg/reg/index') }, 2000);
      return false;
    }
  }
  switch (type) {
    case 'app':
      return toApp(option);
    case 'h5':
      return toH5(option.url);
    case 'page':
      return toPage(option.url);
    default:
      return;
  }
};

/**
 * 跳转 h5
 * @param {String} url h5 页面地址
 * @return {undefined} 无返回
 */
const toH5 = function (url) {
  // 所有 H5都拼接 uid 及 sign
  /*const objUserInfo = wx.getStorageSync('userinfo');
  if (/\?/.test(url)) {
    url = `${url}&uid=${objUserInfo.uid}&sign=${objUserInfo.sign}`
  } else {
    url = `${url}?uid=${objUserInfo.uid}&sign=${objUserInfo.sign}`
  }*/
  toPage(`/pages/webview/index?url=${encodeURIComponent(url)}`);
};

/**
 * 跳转小程序
 * @param {String} appId 目标小程序 appId
 * @param {Object} option 选项
 * @return {undefined} 无返回
 */
const toApp = function ({ appId, path = '', extraData = {}, envVersion = 'release' }) {
  wx.navigateToMiniProgram({
    appId,
    path,
    extraData,
    envVersion,
    success(res) {
      console.log('跳转小程序成功', res);
    },
    fail(error) {
      console.log('跳转小程序失败', error);
    }
  });
};

/**
 * 跳转小程序内页面
 * @param {string} url 要跳转的地址
 * @param {string} [type=navigateTo] 跳转类型 eg: redirectTo,navigateTo,reLaunch
 * @returns {null} 无返回
 */
const toPage = function (url, type = 'navigateTo') {
  const arrUrl = config.tabUrl;
  let intSwitchTab = false;
  arrUrl.forEach(val => {
    if (val == url) {
      intSwitchTab = true;
    }
  });
  if (intSwitchTab) {
    wx.switchTab({ url: url });
  } else {
    if (type == 'redirectTo') {
      // 关闭当前页面，跳转到应用内的某个页面
      wx.redirectTo({ url: url });
    } else if (type == 'reLaunch') {
      // 关闭所有页面，打开到应用内的某个页面
      wx.reLaunch({ url: url });
    } else {
      wx.navigateTo({ url: url });
    }
  }
};

module.exports = {
  cloudFunToPromise,
  redirect,
  toPage,
  version,
  name
};
